package com.xinchao.ck_mips.http.api;

import com.xinchao.ck_mips.bean.ConfigBean;
import com.xinchao.ck_mips.bean.DeviceInfoBean;
import com.xinchao.ck_mips.bean.NewestProgramBean;
import com.xinchao.ck_mips.bean.UpgradeBean;
import com.xinchao.ck_mips.http.CKResponse;

import java.util.List;

import io.reactivex.Flowable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

/**
 * 网络请求接口
 */
public interface ApiService {
    /**
     * 终端绑定
     *
     * @param code ：8位序列号
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/bind")
    Flowable<CKResponse<Object>> bind(@Field("serialNum") String code);

    /**
     * 注册
     *
     * @param lastTime   终端最近一次开机时间
     * @param localIP    内网IP
     * @param deviceName 终端名称 可为空
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/register")
    Flowable<CKResponse<Object>> register(@Field("lastRebootTime") Long lastTime
            , @Field("intranetIP") String localIP, @Field("deviceName") String deviceName);

    /**
     * 上传wifi探针数据
     * 这里传入url地址，而非wifi文件
     *
     * @param time 文件上传时间
     * @param url  WiFi探针文件上传至与服务器后返回的地址
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/wifiMacShows")
    Flowable<CKResponse<Object>> uploadWifiMAC(@Field("time") long time, @Field("url") String url);

    /**
     * 上传监播数据报告
     * 节目每播放完一轮上传
     *
     * @param data json数据
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/reportShows")
    Flowable<CKResponse<Object>> reportShow(@Field("jsonData") String data);

    /**
     * 上传日志
     *
     * @param type crash(奔溃日志);run(运行日志);play(播放日志)
     * @param url  日志文件地址
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/uploadLog")
    Flowable<CKResponse<Object>> uploadLog(@Field("type") String type, @Field("url") String url);

    /**
     * 上报节目下载状态
     *
     * @param state   0:已下载；1：下载中;2:下载失败
     * @param version 当前正在下载节目版本号
     * @param reason  失败原因（如果失败，该字段非空）
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/uploadProgramDownloadStatus")
    Flowable<CKResponse<Object>> uploadDownloadStatus(@Field("state") int state,
                                                      @Field("downloadProgramVersion") String version,
                                                      @Field("failureReason") String reason);

    /**
     * 终端自有设置与服务端同步
     *
     * @param volume 音量值
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/settingSync")
    Flowable<CKResponse<Object>> settingSync(@Field("volume") int volume);

    /**
     * 获取终端最新升级信息
     *
     * @return
     */
    @POST("ckclient/getUpgrade")
    Flowable<CKResponse<List<UpgradeBean>>> getUpgrade();

    /**
     * 获取升级信息后反馈，告知服务端已获取升级信息
     *
     * @param serialNo 唯一批次号，有轮询返回
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/getUpgradeReply")
    Flowable<CKResponse<String>> getUpgradeReply(@Field("serialNo") String serialNo);

    /**
     * 获取最新节目信息
     *
     * @param capacity 终端当前剩余容量（字节）
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/getNewestProgram")
    Flowable<CKResponse<NewestProgramBean>> getNewestProgram(@Field("residualCapacity") long capacity);

    /**
     * 获取最新节目信息后反馈
     *
     * @param serialNo 唯一批次号。轮询返回,可为空
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/getNewestProgramReply")
    Flowable<CKResponse<Object>> getNewestProgramReply(@Field("serialNo") String serialNo);

    /**
     * 获取最新设置信息
     *
     * @return
     */
    @POST("ckclient/getNewestSetting")
    Flowable<CKResponse<ConfigBean>> getNewestSetting();

    /**
     * 获取最新设置信息反馈，告知服务端已获取最新信息
     *
     * @param serialNo
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/getNewestSettingReply")
    Flowable<CKResponse<Object>> getNewestSettingReply(@Field("serialNo") String serialNo);

    /**
     * 终端轮询接口
     *
     * @param hours 重启连续工作时间 单位：小时
     * @param ip    内网ip
     * @param time  最近一次开机时间 时间戳long
     * @return
     */
    @FormUrlEncoded
    @POST("ckclient/report")
    Flowable<CKResponse<DeviceInfoBean>> report(@Field("continuousWorkingHours") int hours,
                                                @Field("intranetIP") String ip,
                                                @Field("lastRebootTime") long time);
}
